﻿/**
 * @file coverwidgetheaderview.h
 * @author huangxb
 * @email 18228033207@163.com
 * @date 2024.04.07
 * @license MIT License
 * @brief 通过自定义widget覆盖视图项所在位置来显示自定义控件.
 * 视图项自定义widget父窗口使用视图viewport()函数返回的widget，
 * 这样视图自绘时也会绘制其子窗口，达到视图项显示自定义widget的效果。
 * 而自定义视图的位置是通过实现QHeaderView，在其paint函数中获取该
 * 视图项当前位置，然后对自定义widget使用setGeometry显示在该位置
 * （相当于盖住了原视图项的内容），达到视图显示自定义控件的功能。
 *
 * @htmlonly
 * <span style="font-weight: bold">History</span>
 * @endhtmlonly
 * Version|Auther|Date|Describe
 * ------|----|------|--------
 * V1.0|huangxb|2024.04.07|创建
 */
#ifndef CCOVERWIDGETHEADERVIEW_H
#define CCOVERWIDGETHEADERVIEW_H

/* 库头文件 */
#include <QHeaderView>
#include <QMap>

/** @brief 通过自定义widget覆盖视图项所在位置来显示自定义控件. */
class CCoverWidgetHeaderView : public QHeaderView
{
    Q_OBJECT

public:
    /**
     * @brief 构造函数
     * @param orientation 视图头方向，纵向或横向
     * @param parent 父控件
     */
    CCoverWidgetHeaderView(Qt::Orientation orientation, QWidget *parent = nullptr);

    /**
     * @brief 设置视图头的自定义控件.
     * 内部会修改控件的父控件为视图头，若当前列已经有自定义控件，将会释放原控件再重新设置
     *
     * @param logicalIndex 视图头索引
     * @param pWidget 自定义控件
     */
    void SetWidget(int logicalIndex, QWidget* pWidget);

    /**
     * @brief 获取视图头的自定义控件.
     * @param logicalIndex 视图头索引
     * @return 自定义控件
     */
    QWidget* GetWidget(int logicalIndex) const;

    /**
     * @brief 取出视图头的自定义控件.
     * 取出前不会释放该控件内存
     *
     * @param logicalIndex 视图头索引
     * @return 自定义控件
     */
    QWidget* TakeWidget(int logicalIndex);

protected:
    /**
     * @brief 视图头自定义绘制策略
     * @param painter 绘制设置
     * @param rect 视图项所在矩形范围
     * @param logicalIndex 视图头索引
     */
    void paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const override;

    /** @see QObject */
    bool eventFilter(QObject *object, QEvent *event) override;

private:
    QMap<int, QWidget*> m_mapHeaderWidget; /**< 每列使用的自定义widget */
};

#endif // CCOVERWIDGETHEADERVIEW_H
